/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package wasolicitudesfiec.logicacontrol.SolicitarSerAyudante;

import web.util.Constantes;
import entidad.Datosfinancieros;
import entidad.ayudantias.Solicitudserayudante;
import entidad.ayudantias.TipoAyudantia;
import hero.interfaces.BnNodePropertyValue;
import hero.interfaces.BnNodeValue;
import hero.interfaces.UserRegistration;
import java.sql.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.context.FacesContext;
import wasolicitudesfiec.Ayudantias.SolicitarSerAyudante.ConfirmacionEstudiante;
import wasolicitudesfiec.general.MensajeException;
import wasolicitudesfiec.logicacontrol.*;

/**
 *
 * @author Administrador
 */
public class CTRL_ConfirmacionEstudiante extends CTRL_Base {

    private ConfirmacionEstudiante gui;
    private UserRegistration userRegistration;
    private String nombreActividad = Constantes.SolicitarSerAyudante.confirmarAceptacion;

    public CTRL_ConfirmacionEstudiante(ConfirmacionEstudiante gui, FacesContext facesContext) {
        super(facesContext);
        this.gui = gui;
        userRegistration = logica.getUserRegistration();
        String instancia;
        instancia = (String) externalContext.getRequestParameterMap().get("instancia");
        if (instancia != null) {
            externalContext.getSessionMap().put("instancia", instancia);
        }
    }

    public void inicializar() throws MensajeException {


        precargarDatosSiEsPosible();
    }

    public String getNombreInstanciaProceso() {
        String instancia;
        instancia = (String) externalContext.getSessionMap().get("instancia");
        return instancia;
    }

    private void precargarDatosSiEsPosible() throws MensajeException {
        String nombreInstanciaProceso;

        BnNodeValue actividad;
        Solicitudserayudante solicitudSerAyudante;
        TipoAyudantia tipoAyudantia;

        try {
            nombreInstanciaProceso = getNombreInstanciaProceso();
            this.inicializarInstancia(nombreInstanciaProceso);
            actividad = usrSession.getNode(nombreInstanciaProceso, nombreActividad);
            if (!(actividad != null && (actividad.getState() == hero.interfaces.Constants.Nd.READY))) {
                throw new Exception();
            }
            int idSolicitudSerAyudante = Integer.parseInt(prjSession.getProperty(Constantes.Atributo.idSolicitudProceso).getTheValue());
            solicitudSerAyudante = logica.getLogAyudantia().leerSolicitudserayudanteNivel2(idSolicitudSerAyudante);

            int numhoras = solicitudSerAyudante.getHorasContrato();
            //horas contrato
            gui.getLabel1().setText("Ud. ha sido seleccionado para ser ayudante a " + numhoras + " horas");

            // obtener nombre y tipo de ayudnatia
            tipoAyudantia = logica.leerTipoAyudantia(solicitudSerAyudante.getSolicitudayudantia());
            if (tipoAyudantia.getTipo() == TipoAyudantia.TipoAyudantiaEnum.ACADEMICA) {
                gui.getLabel3().setText(solicitudSerAyudante.getSolicitudayudantia().getMateria().getNombre());
            } else {
                gui.getLabel3().setText(solicitudSerAyudante.getSolicitudayudantia().getAyudantiavaria().getNombre());
            }
            gui.getLblFechaMaxConfirmacion().setText(solicitudSerAyudante.getSolicitudayudantia().getFechaMaxConfimacion());
            gui.getLabel2().setText(tipoAyudantia.getNombre());
        } catch (MensajeException exception) {
            throw exception;
        } catch (Exception exception) {
            throw new MensajeException(Constantes.Mensajes.noInicia);
        }
    }

    public boolean guardarActividad(String respuesta) throws MensajeException {
        String nombreInstanciaProceso;
        BnNodeValue actividad;
        final String nombreActividad = Constantes.SolicitarSerAyudante.confirmarAceptacion;
        Datosfinancieros datosfinancieros = new Datosfinancieros();

        Solicitudserayudante solicitudSerAyudanteGeneral;
        Solicitudserayudante solicitudSerAyudanteActividadConfirmacion;
        try {
            if (!(usrSession != null && prjSession != null)) {
                throw new Exception();
            }
            nombreInstanciaProceso = getNombreInstanciaProceso();
            if (nombreInstanciaProceso == null) {
                throw new Exception();
            }
            int idSolicitudSerAyudante = Integer.parseInt(prjSession.getProperty(Constantes.Atributo.idSolicitudProceso).getTheValue());
            int idActividadConfirmacion = Integer.parseInt(prjSession.getNodeProperty(nombreActividad, Constantes.Atributo.idSolicitudActividad).getTheValue());
            gui.getMenu().setTitulo(Constantes.Modelo.modelo_SolicitarAyudantes + "_" + idSolicitudSerAyudante + ": " + nombreActividad);
            solicitudSerAyudanteGeneral = logica.getLogAyudantia().leerSolicitudserayudanteNivel2(idSolicitudSerAyudante);
            solicitudSerAyudanteActividadConfirmacion = logica.getLogAyudantia().leerSolicitudserayudanteNivel2(idActividadConfirmacion);
            solicitudSerAyudanteGeneral.setRespuestaConfirmacion(respuesta);
            solicitudSerAyudanteActividadConfirmacion.setRespuestaConfirmacion(respuesta);
            if (respuesta.equals(Constantes.Atributo.DecisionConfirmacion.Aceptar.toString())) {
                datosfinancieros.setTipoCuenta((String) gui.getDropDown1().getSelected());
                datosfinancieros.setBanco((String) gui.getTextField1().getText());
                datosfinancieros.setNumeroCuenta((String) gui.getTextField2().getText());
                datosfinancieros.setFkIdEstudiante(solicitudSerAyudanteGeneral.getFkIdEstudiante());
                datosfinancieros = logica.nuevoDatosFinancieros(datosfinancieros);
                solicitudSerAyudanteGeneral.setFkIdDatosFinancieros(datosfinancieros.getIdDatosFinancieros());
                solicitudSerAyudanteActividadConfirmacion.setFkIdDatosFinancieros(datosfinancieros.getIdDatosFinancieros());
                 solicitudSerAyudanteGeneral.setEstado(Constantes.EstadoSolicitud.Terminada.toString());
                solicitudSerAyudanteActividadConfirmacion.setEstado(Constantes.EstadoSolicitud.Terminada.toString());
            }
            actividad = usrSession.getNode(nombreInstanciaProceso, nombreActividad);
            if (!(actividad != null && (actividad.getState() == hero.interfaces.Constants.Nd.READY || actividad.getState() == hero.interfaces.Constants.Nd.ANTICIPABLE))) {
                throw new Exception();
            }
            expiroAyudantia();
            prjSession.setNodeProperty(nombreActividad, Constantes.Atributo.decisionConfirmacion, respuesta);
            usrSession.startActivity(nombreInstanciaProceso, nombreActividad);
            usrSession.terminateActivity(nombreInstanciaProceso, nombreActividad);
            logica.getLogAyudantia().guardarSolicitudserayudante(solicitudSerAyudanteGeneral);
            logica.getLogAyudantia().guardarSolicitudserayudante(solicitudSerAyudanteActividadConfirmacion);

            return true;
        } catch (MensajeException exception) {
            throw exception;
        } catch (Exception exception) {
            throw new MensajeException(Constantes.Mensajes.noGuarda);
        }
    }

    public boolean expiroAyudantia() throws MensajeException {
        String nombreInstanciaProceso;
        BnNodeValue actividad;
        try {
            nombreInstanciaProceso = getNombreInstanciaProceso();
            this.inicializarInstancia(nombreInstanciaProceso);
            actividad = usrSession.getNode(nombreInstanciaProceso, nombreActividad);
            if (actividad == null) {
                throw new Exception();
            }
            boolean expiro = (actividad.getState() == hero.interfaces.Constants.Nd.TERMINATED);
            if (expiro) {
                throw new MensajeException("El tiempo para enviar su respuesta ha finalizado. Comuníquese con el profesor responsable de la ayudantía si desea requerir " +
                        "una nueva fecha de confirmación");
            }
            return expiro;
        } catch (MensajeException exception) {
            throw exception;
        } catch (Exception exception) {
            exception.printStackTrace();
            Logger.getLogger(CTRL_EstudianteSolicitaSerAyudante.class.getName()).log(Level.SEVERE, null, exception);
            throw new MensajeException(Constantes.Mensajes.noInicia);
        }
    }
}
